package com.neusoft.baidu.util;

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;

import java.io.IOException;
import java.util.HashMap;

/**
 * 百度ocr请求工具类
 * @Author: zhengdc
 * @Date: 2019-12-03
 * @Version: V2.0
 */
public class BdOcrHelper {
    //设置APPID/AK/SK
    // TODO 此处需要替换成开发者自己的AK(在百度云访问控制台寻找)
    static String appId;
    static String apiKey;
    static String secretKey;

    public static void setAppId(String appId) {
        BdOcrHelper.appId = appId;
    }

    public static void setApiKey(String apiKey) {
        BdOcrHelper.apiKey = apiKey;
    }

    public static void setSecretKey(String secretKey) {
        BdOcrHelper.secretKey = secretKey;
    }

    public static String getAppId() {
        return appId;
    }

    public static String getApiKey() {
        return apiKey;
    }

    public static String getSecretKey() {
        return secretKey;
    }

    // 初始化一个AipOcr
    public AipOcr client;

    public BdOcrHelper() {
        // 初始化一个AipOcr
        client = new AipOcr(appId, apiKey, secretKey);

        // 可选：设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选：设置代理服务器地址, http和socket二选一，或者均不设置
        /*client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理*/
    }

    /**
     * 根据百度ai平台上配置自定义模板编码，对某张图片进行识别
     *
     * @param templateId 模板编码，ai平台上配置好的
     * @param filePath   图片路径，服务器上的路径
     * @return
     */
    public JSONObject getTempInfo(String templateId, String filePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();

        // 参数为二进制数组
        byte[] file = new byte[0];
        try {
            file = FileUtil.readFileByBytes(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject resultGet = client.custom(file, templateId, options);
        System.out.println(resultGet);

        return resultGet;
    }

    /**
     * 通过图片文件byte进行识别为表格数据
     *
     * @param filePath 表格图片路径，服务器上的路径
     * @return
     */
    public JSONObject getTableFileInfo(String filePath) {
        /*表格识别测试，图片识别*/
        HashMap<String, String> options = new HashMap<String, String>();

        // 参数为二进制数组
        byte[] file = new byte[0];
        try {
            file = FileUtil.readFileByBytes(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject resultGet = client.tableRecognitionAsync(file, options);
        System.out.println(resultGet.toString());

        return resultGet;
    }

    /**
     * 直接使用图片地址进行识别表格数据
     *
     * @param filePath 表格图片路径，服务器上的路径
     * @return
     */
    public JSONObject getTableImageInfo(String filePath) {
        /*识别表格中的数据，以json格式输出-同步*/
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();

        // 参数为本地路径
        JSONObject resultGet = client.tableRecognitionAsync(filePath, options);
        System.out.println(resultGet.toString());
        /*识别表格中的数据，以json格式输出-同步*/

        return resultGet;
    }

    /**
     * 通过生成的模板编码获取excel数据
     *
     * @param requestId  通过返回结果获取，getJSONArray("result").getJSONObject(0).getString("request_id")
     * @param resultType 需要返回的结果类型：json、excel，取值为“excel”时返回xls文件的地址，取值为“json”时返回json格式的字符串,默认为”excel”
     * @return
     */
    public JSONObject getRequestInfo(String requestId, String resultType) {
        /*表格识别数据获取*/
        HashMap<String, String> optionsRes = new HashMap<String, String>();
        optionsRes.put("result_type", resultType);

        // 表格识别结果
        JSONObject resultGet = client.tableResultGet(requestId, optionsRes);
        System.out.println(resultGet.toString());
        /*表格识别数据获取*/

        return resultGet;
    }

    /**
     * 通用增值税发票识别
     *
     * @param filePath 发票图片路径，服务器上的路径
     * @return
     */
    public JSONObject getReceiptInfo(String filePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("recognize_granularity", "big");
        options.put("probability", "true");
        options.put("accuracy", "normal");
        options.put("detect_direction", "true");

        // 参数为二进制数组
        byte[] file = new byte[0];
        try {
            file = FileUtil.readFileByBytes(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject resultGet = client.receipt(file, options);
        System.out.println(resultGet.toString());

        return resultGet;
    }

    /**
     * 增值税发票识别
     *
     * @param filePath
     * @return
     */
    public JSONObject getVatInvoice(String filePath) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();

        // 参数为二进制数组
        byte[] file = new byte[0];
        try {
            file = FileUtil.readFileByBytes(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject resultGet = client.vatInvoice(file, options);
        System.out.println(resultGet.toString());

        return resultGet;
    }
}
